часть 1 | Обработка событий || Download
Прозрачная заставка в форме немодального диалога (часть 2)
(из книги "AutoCAD: разработка приложений, настройка и адаптация")
На рис. 5.63 показано окно заставки нашего приложения на фоне текущего рисунка. Окно открывается с помощью LISP-выражения (book16), вводимого в командной строке AutoCAD.
Рис. 5.63. Окно с прозрачной заставкой
Это прозрачное окно напоминает то окно, которое открывается при начальной загрузке AutoCAD.
Теперь рассмотрим конструктор окна (функцию Wform16::Wform16 в файле Splash16.cpp). Сначала
идет задание параметров окна. Смысл свойств Size, StartPosition, Location и
BackColor нам хорошо понятен по предыдущему примеру. (Прим.
автора: размер, положение и цвет фона окна.)
Свойство Opacity задает коэффициент непрозрачности. Оно может принимать вещественные значения от 0 до 1.
При 1 окно полностью непрозрачно, при 0 - полностью прозрачно (фактически не видно). В нашем случае
использовано среднее значение (0.5).
Свойству FormBorderStyle задано значение None из перечисления FormBorderStyle.
При этом значении окно не имеет ни рамки, ни заголовка (как в заставке системы AutoCAD).
Для размещения в центре окна надписи необходимо подготовить шрифт. Для этого создаются объекты классов
FontFamily и Font. Шрифт используется в создаваемом объекте класса Label, который
с помощью метода Add добавляется к семейству Controls элементов управления диалога.
Следующая строка конструктора добавляет обработчик события Click, т. е. щелчка внутри формы
(но не на текстовом элементе, который имеет свое событие Click):
this->Click = new EventHandler(this, &Wform16::OnClick);
Обработчик события является объектом класса EventHandler. С помощью рассматриваемой строки с этим
объектом связывается делегат - ссылка на функцию Wform16::OnClick. Это именно та функция, которая
должна вызываться при возникновении отслеживаемого события.
Функция Wform16::OnClick имеет очень простое тело - в нем вызывается метод Close. Поэтому при щелчке
внутри формы окно заставки закрывается.
Последние четыре оператора в конструкторе диалога создают таймер с определенными свойствами. Сам таймер,
который генерирует сигналы с некоторой частотой, является объектом класса Timer. В FCL (Framework Class Library)
одноименные классы присутствует в трех пространствах имен: System.Timer, System.Threading и
System.Windows.Forms. В проекте Book16 мы выбрали последний из трех классов.
При создании таймера необходимо задать значения по крайней мере двум его свойствам:
tm->add_Tick(new EventHandler(this,&Wform16::TimerOnTick));
Первый сигнал таймер выдаст через пять секунд после запуска. Этот сигнал в нашем примере должен стать
и последним: функция Wform16::TimerOnTick останавливает таймер (используется метод Stop)
и закрывает диалоговое окно.
Таймер необходимо останавливать (альтернатива - свойству Enabled присвоить значение false),
ибо после этого автоматический сборщик мусора может освободить память, выделенную под таймер.
Таким образом, в нашем примере заставка появляется на экране в немодальном режиме (т. е. можно выполнять
какие-то построения в рисунке в присутствии заставки) и исчезает, если пользователь щелкнет по ней или
истечет пять секунд с момента запуска.
Если есть ненулевая вероятность одновременного запуска второй такой же заставки, то полезно добавить
в приложение анализ предварительного существования диалога в оперативной памяти (достаточно для этого
завести соответствующую глобальную переменную и проверять ее значение).